package common;

import java.io.File;
import java.util.Scanner;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import common.BaseClasses.CommonDao;

public class Test extends CommonDao {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String sourceFilesPath="";	
		sourceFilesPath="D:\\word";
		//目标文档要存放的目录
		String destinationFilesPath="";
		destinationFilesPath="D:\\pdf";
		//选择要转换的类型
		int destinationFilesType=0;
		int inputNumber=0;
		boolean numFlag=true;
		System.out.println("您要将word文档转换为哪种文档格式？");
		System.out.println("0:doc \t 2:txt \t 8:html \t 9:htm \t 11:xml \t 12:docx \t 17:pdf \t 18:xps");
		while(numFlag){
			inputNumber=sc.nextInt();
			if(inputNumber!=2&&inputNumber!=8&&inputNumber!=9&&inputNumber!=11&&inputNumber!=12&&inputNumber!=17){
				System.out.println("您的输入有误，请输入要转换的文档类型前的数字");
			}else
				numFlag=false;
		}		
		destinationFilesType=inputNumber;
		change(sourceFilesPath, destinationFilesPath,destinationFilesType);
	}

	public static void change(String sourceFilesPath,
			String destinationFilesPath, int destinationFilesType) {
		// 使用word文件所在的目录（源路径）建立目录
		File sourcePathFile = new File(sourceFilesPath);
		File sourceFilesList[] = sourcePathFile.listFiles();
		String sourceChildPath = new String("");
		String destiNationChildPath = new String("");
		// 检索文件，过滤掉非word文件，通过扩展名过滤
		for (int i = 0; i < sourceFilesList.length; i++) {
			// 排除掉子文件夹
			if (sourceFilesList[i].isFile()) {
				System.out.println("第" + (i + 1) + "个文件：");
				// 取得文件全名（包含扩展名）
				String fileName = sourceFilesList[i].getName();
				String fileType = new String("");
				// 取得文件扩展名
				fileType = fileName.substring((fileName.length() - 4),
						fileName.length());
				if (fileType.equals("docx")) {
					System.out.println("正在转换。。。");
					// 输出word文档所在路劲
					System.out.println("目录：" + sourceFilesPath);
					// 输出word文档名
					System.out.println("文件名：" + fileName);
					// System.out.println(fileName.substring(0,
					// (fileName.length()-5)));
					// 核心函数
					// 启动word
					ActiveXComponent app = new ActiveXComponent("Word.Application");
					// 要转换的文档的全路径（所在文件夹+文件全名）
					String docPath = sourceFilesPath + "\\" + fileName;
					// 转换后的文档的全路径（所在文件夹+文件名）
					String othersPath = destinationFilesPath + "\\"
							+ fileName.substring(0, (fileName.length() - 5));
					//
					String inFile = docPath;
					String outFile = othersPath;
					//
					boolean flag = false;
					// 核心代码
					try {
						// 设置word可见性
						app.setProperty("Visible", new Variant(false));
						Dispatch docs = app.getProperty("Documents").toDispatch();
						// 打开word文档
						Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { inFile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();
						Dispatch.invoke(doc, "SaveAs", Dispatch.Method,new Object[] { outFile,new Variant(destinationFilesType) },new int[1]);
						System.out.println("----------outFile"+outFile);
						Variant file = new Variant(false);
						Dispatch.call(doc, "Close", file);
						flag = true;
					} catch (Exception e) {
						e.printStackTrace();
						System.out.println("文档转换失败");
					} finally {
						app.invoke("Quit", new Variant[] {});
					}
					System.out.println("转换完毕");
				}
				// word97-2003扩展名为doc
				// 判断是否为word2003-2007文档，及是否以doc为后缀名
				else if (fileType.equals(".doc")) {
					System.out.println("正在转换。。。");
					// 输出word文档所在路劲
					System.out.println("目录：" + sourceFilesPath);
					// 输出word文档名
					System.out.println("文件名：" + fileName);
					// System.out.println(fileName.substring(0,
					// (fileName.length()-4)));
					// 核心函数
					// 启动word
					ActiveXComponent app = new ActiveXComponent(
							"Word.Application");
					// 要转换的文档的全路径（所在文件夹+文件全名）
					String docPath = sourceFilesPath + "\\" + fileName;
					// 转换后的文档的全路径（所在文件夹+文件名）
					String othersPath = destinationFilesPath + "\\"
							+ fileName.substring(0, (fileName.length() - 4));
					//
					String inFile = docPath;
					String outFile = othersPath;
					//
					boolean flag = false;
					// 核心代码
					try {
						// 设置word可见性
						app.setProperty("Visible", new Variant(false));
						//
						Dispatch docs = app.getProperty("Documents")
								.toDispatch();
						// 打开word文档
						Dispatch doc = Dispatch.invoke(
								docs,
								"Open",
								Dispatch.Method,
								new Object[] { inFile, new Variant(false),
										new Variant(true) }, new int[1])
								.toDispatch();
						// 另存为指定格式的文档
						Dispatch.invoke(doc, "SaveAs", Dispatch.Method,
								new Object[] { outFile,
										new Variant(destinationFilesType) },
								new int[1]);
						System.out.println("----------outFile"+outFile);
						Variant file = new Variant(false);
						// 关闭文档
						Dispatch.call(doc, "Close", file);
						//
						flag = true;
					} catch (Exception e) {
						e.printStackTrace();
						System.out.println("文档转换失败");
					} finally {
						app.invoke("Quit", new Variant[] {});
					}
					System.out.println("转换完毕");
				}
				// 文档的扩展名不是doc或docx
				else {
					System.out.println("非word文档");
				}
			}
			// 如果是子文件夹，则递归遍历，将所有的word文档转换
			else {
				//
				sourceChildPath = sourceFilesPath;
				// 该文件是目录
				sourceChildPath = sourceChildPath + "\\"
						+ sourceFilesList[i].getName() + "\\";
				System.out.println("源文件所在路径：" + sourceChildPath);
				// 修改目标文件夹，保持原来的层级关系
				// 修改目标文件夹，保持原来的层级关系
				destiNationChildPath = destinationFilesPath;
				destiNationChildPath = destinationFilesPath + "\\"
						+ sourceFilesList[i].getName() + "\\";
				System.out.println("转换后文件所在路径" + destiNationChildPath);
				//
				mkdir(destiNationChildPath);
				// 递归遍历所有目录，查找word文档，并将其转换
				change(sourceChildPath, destiNationChildPath,
						destinationFilesType);
			}
		}
		System.out.println("所有文档转换完毕");
	}
	/** 
	　* 用于创建文件夹的方法 
	　* @param mkdirName 
	　*/
	public static void mkdir(String mkdirName){
		try{
			//使用指定的路径创建文件对象
			File dirFile = new File(mkdirName); 
			//
			boolean bFile = dirFile.exists();
			//已经存在文件夹，操作？？？提醒是否要替换
			if( bFile == true ) { 
				System.out.println("已经存在文件夹"+mkdirName); 
			}
			//不存在该文件夹，则新建该目录
			else{
				System.out.println("新建文件夹"+mkdirName); 
				bFile = dirFile.mkdir(); 
				if( bFile == true ){
					System.out.println("文件夹创建成功"); 
				}else{
					System.out.println(" 文件夹创建失败，清确认磁盘没有写保护并且空件足够"); 
					System.exit(1); 
				}
			}
		}catch(Exception err){
			System.err.println("ELS - Chart : 文件夹创建发生异常"); 
			err.printStackTrace(); 
		}finally{
			
		}
	}
	/**
	 * 判断某个文件夹是否存在
	 * @param path
	 */
	public static boolean isPathExist(String path){
		boolean isPathExist=false;
		try{
			File pathFile = new File(path);
			if(pathFile.exists())
				isPathExist= true;
			else
				isPathExist= false;
		}catch(Exception err){
			err.printStackTrace(); 
		}
		return isPathExist;
	}
}
